const { getJWTToken } = require("@coze/api");
const fs = require('fs');
const path = require('path');
const axios = require('axios');

// 读取配置文件
const configPath = path.join(__dirname, '../config/coze/coze_oauth_config.json');
const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));

// token 缓存文件路径
const tokenCachePath = path.join(__dirname, '../config/coze/token_cache.json');

let cachedToken = null;
let tokenExpireTime = null;

// 从缓存文件加载 token
function loadTokenFromCache() {
    try {
        const cache = JSON.parse(fs.readFileSync(tokenCachePath, 'utf8'));
        if (cache.token && cache.expireTime) {
            cachedToken = cache.token;
            tokenExpireTime = cache.expireTime;
            console.log('从缓存加载 token 成功，过期时间：', new Date(tokenExpireTime));
        }
    } catch (error) {
        console.error('加载 token 缓存失败：', error);
    }
}

// 保存 token 到缓存文件
function saveTokenToCache() {
    try {
        const cache = {
            token: cachedToken,
            expireTime: tokenExpireTime
        };
        fs.writeFileSync(tokenCachePath, JSON.stringify(cache, null, 2));
        console.log('token 已保存到缓存文件');
    } catch (error) {
        console.error('保存 token 缓存失败：', error);
    }
}


// 获取 Coze access token
async function getAccessToken() {
    try {
        const now = Date.now();
        console.log('当前时间：', new Date(now));
        console.log('token 过期时间：', tokenExpireTime ? new Date(tokenExpireTime) : '未设置');

        // 如果没有加载缓存，先加载
        if (!cachedToken && !tokenExpireTime) {
            loadTokenFromCache();
        }

        // 检查缓存的 token 是否还有效
        if (cachedToken && tokenExpireTime) {
          // 提前 1 分钟刷新 token
          const shouldRefresh = now > (tokenExpireTime - 1 * 60 * 1000);
          
          if (!shouldRefresh) {
            console.log('使用缓存的有效 token');
            return cachedToken;
          } else {
              console.log('token 即将过期，需要刷新');
          }
        }

        console.log('开始获取新的 token...');
        const token = await getJWTToken({
            baseURL: config.coze_api_base,
            appId: config.client_id,
            aud: new URL(config.coze_api_base).host,
            keyid: config.public_key_id,
            privateKey: config.private_key,
        });

        // 更新缓存的 token 和过期时间
        cachedToken = token.access_token;
        // expires_in 默认有效期 15分钟
        tokenExpireTime = (token.expires_in) * 1000;

        console.log('获取新 token 成功，过期时间：', new Date(tokenExpireTime), token.expires_in);

        // 保存到缓存文件
        saveTokenToCache();

        return cachedToken;
    } catch (error) {
        console.error('获取 Coze token 失败:', error);
        throw error;
    }
}

// 获取带有最新 token 的请求头
async function getAuthHeaders() {
    const token = await getAccessToken();
    return {
        'Authorization': `Bearer ${token}`
    };
}

// 初始化时加载缓存
loadTokenFromCache();

module.exports = {
    getAccessToken,
    getAuthHeaders
}; 